package qc.module.cms.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.exception.QCPromptException;
import qc.common.core.unify.QCUnifyReturnValue;
import qc.common.core.utils.DateUtil;
import qc.module.cms.dto.securityledger.SecurityLedgerDto;
import qc.module.cms.entity.SecurityLedger;
import qc.module.cms.mapper.SecurityLedgerMapper;
import qc.module.cms.repository.SecurityLedgerRepository;

import java.util.Date;
import java.util.List;

/**
 * SecurityLedgerService
 *
 * @author QuCheng Tech
 * @since 2023/12/26
 */
@Service
public class SecurityLedgerService {
    private SecurityLedgerRepository repository;

    @Autowired
    public void setSecurityLedgerRepository(SecurityLedgerRepository repository) {
        this.repository = repository;
    }

    /**
     * 获取所有的Led画面
     *
     * @return java.util.List<qc.module.cms.dto.SecurityLedgerDto>
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public List<SecurityLedgerDto> getAll() {
        LambdaQueryWrapper<SecurityLedger> wrapper = new LambdaQueryWrapper<>();

        //排序，按发生的时间降序排列
        wrapper.orderByDesc(SecurityLedger::getTm);

        //查询数据
        List<SecurityLedger> list = repository.selectList(wrapper);
        if (list != null && list.size() > 0x0) {
            return SecurityLedgerMapper.MAPPER.toDtoList(list);
        }

        return null;
    }

    /**
     * 获取指定日期历史上发生的事故集合
     *
     * @param date 指定的日期，同时匹配月份和日期
     * @return java.util.List<qc.module.cms.dto.securityledger.SecurityLedgerDto>
     * @author QuCheng Tech
     * @since 2023/12/27
     */
    public List<SecurityLedgerDto> getHistoryByDate(Date date) {
        if (date != null) {
            LambdaQueryWrapper<SecurityLedger> wrapper = new LambdaQueryWrapper<>();

            //使用mysql的行数进行月份和日期匹配
            wrapper.apply("DATE_FORMAT(tm, '%m%d') = '" + DateUtil.getString(date, "MMdd") + "'");
            //排序，按发生的时间
            wrapper.orderByAsc(SecurityLedger::getTm);

            //查询数据
            List<SecurityLedger> list = repository.selectList(wrapper);
            if (list != null && list.size() > 0x0) {
                return SecurityLedgerMapper.MAPPER.toDtoList(list);
            }
        }

        return null;
    }

    /**
     * 获取指定id的画面信息
     *
     * @param id 画面ID
     * @return qc.module.cms.dto.link.LinkDto
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public SecurityLedgerDto get(Integer id) throws QCPromptException {
        if (id == null)
            throw new QCPromptException("大屏画面ID不能为空");

        SecurityLedger en = repository.selectById(id);

        if (en != null) {
            return SecurityLedgerMapper.MAPPER.toDto(en);
        }

        return null;
    }

    /**
     * 新增Led画面
     *
     * @param dto 大屏画面对象
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public String add(SecurityLedgerDto dto) {
        if (dto == null)
            return QCUnifyReturnValue.Warn("对象不能为空");
        if (StringUtils.isBlank(dto.getContent()))
            return QCUnifyReturnValue.Warn("详情内容不能为空");
        if (StringUtils.isBlank(dto.getDept()))
            return QCUnifyReturnValue.Warn("车间/部门不能为空");
        if (StringUtils.isBlank(dto.getCategory()))
            return QCUnifyReturnValue.Warn("事件分类不能为空");
        if (StringUtils.isBlank(dto.getCause()))
            return QCUnifyReturnValue.Warn("事件原因/人员不能为空");
        if (StringUtils.isBlank(dto.getObstacle()))
            return QCUnifyReturnValue.Warn("障碍等级不能为空");

        //DTO转换为Entity
        SecurityLedger en = SecurityLedgerMapper.MAPPER.toEntity(dto);
        //判断日期是否正确，不能为空或大于当前日期
        if (en.getTm() == null)
            return QCUnifyReturnValue.Warn("发生日期不能为空");
        if (DateUtil.getTodayDate().before(en.getTm()))
            return QCUnifyReturnValue.Warn("发生日期填写错误，不能大于当前日期");

        en.setId(genereateId());

        if (repository.insert(en) < 0x1)
            return QCUnifyReturnValue.Warn("保存失败");

        return QCUnifyReturnValue.Success();
    }

    /**
     * 修改Led画面信息
     *
     * @param dto 画面信息
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public String update(SecurityLedgerDto dto) {
        if (dto == null)
            return QCUnifyReturnValue.Warn("对象不能为空");
        if (dto.getId() < 0x1)
            return QCUnifyReturnValue.Warn("记录ID不能为空");
        if (StringUtils.isBlank(dto.getContent()))
            return QCUnifyReturnValue.Warn("详情内容不能为空");
        if (StringUtils.isBlank(dto.getDept()))
            return QCUnifyReturnValue.Warn("车间/部门不能为空");
        if (StringUtils.isBlank(dto.getCategory()))
            return QCUnifyReturnValue.Warn("事件分类不能为空");
        if (StringUtils.isBlank(dto.getCause()))
            return QCUnifyReturnValue.Warn("事件原因/人员不能为空");
        if (StringUtils.isBlank(dto.getObstacle()))
            return QCUnifyReturnValue.Warn("障碍等级不能为空");

        //DTO转换为Entity
        SecurityLedger en = SecurityLedgerMapper.MAPPER.toEntity(dto);
        //判断日期是否正确，不能为空或大于当前日期
        if (en.getTm() == null)
            return QCUnifyReturnValue.Warn("发生日期不能为空");
        if (DateUtil.getTodayDate().before(en.getTm()))
            return QCUnifyReturnValue.Warn("发生日期填写错误，不能大于当前日期");

        repository.updateById(en);

        return QCUnifyReturnValue.Success();
    }

    /**
     * 删除，物理删除
     *
     * @param id 要删除的画面ID
     * @return java.lang.String
     * @author QuCheng Tech
     * @since 2023/12/26
     */
    public String delete(Integer id) {
        if (id == null)
            return QCUnifyReturnValue.Warn("要删除的大屏画面ID不能为空");

        if (!hasIdExist(id))
            return QCUnifyReturnValue.Warn("要删除的大屏画面不存在");

        repository.deleteById(id);

        return QCUnifyReturnValue.Success();
    }

    /**
     * 判断指定的ID是否存在
     *
     * @param id 链接ID
     * @return true表示已存在，false表示不存在
     * @author QuCheng Tech
     * @since 2023/5/26
     */
    public boolean hasIdExist(Integer id) {
        LambdaQueryWrapper<SecurityLedger> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SecurityLedger::getId, id);

        SecurityLedger en = repository.selectOne(wrapper);
        if (en != null)
            return true;

        return false;
    }

    /**
     * 生成记录ID，获取数据库表中的最大记录ID+1
     *
     * @return 生成记录ID
     * @author QuCheng Tech
     * @since 2023/5/25
     */
    Integer genereateId() {
        Integer maxRecordId = getMaxId();
        return maxRecordId + 1;
    }

    /**
     * 获取数据库表中的最大ID值，没有记录时返回0
     *
     * @return 返回数据库表中的最大ID值
     * @author QuCheng Tech
     * @since 2023/5/25
     */
    Integer getMaxId() {
        LambdaQueryWrapper<SecurityLedger> wrapper = new LambdaQueryWrapper<>();
        wrapper.select(SecurityLedger::getId);
        wrapper.orderByDesc(SecurityLedger::getId);
        SecurityLedger en = repository.selectOne(wrapper);
        if (en != null)
            return en.getId();

        return 0x0;
    }
}
